package br.unicamp.ic.sgct.server.dominio.entidades;

import br.unicamp.ic.sgct.client.dominio.to.AvaliacaoTO;
import br.unicamp.ic.sgct.client.dominio.to.AvaliadorTO;
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.TableGenerator;


import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
//import org.hibernate.cfg.annotations.Nullability;

//import com.sun.istack.internal.Nullable;

import br.unicamp.ic.sgct.client.dominio.to.StatusAvaliacao;
import java.util.Date;
import javax.persistence.JoinColumns;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@SuppressWarnings("serial")
@Entity(name = "Avaliacao")
@Table(name = "T_AVALIACAO")
@TableGenerator(name = "AVALIACAO_GEN", allocationSize = 1, initialValue = 1, table = "T_ID",
pkColumnName = "key", valueColumnName = "valor", pkColumnValue = "ID_AVALIACAO")
public class Avaliacao implements Serializable {

    @Id
    @Column(name = "id_avaliacao", unique = true)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "AVALIACAO_GEN")
    private long id;
    @Column(name = "status")
    @Type(type = GenericEnumUserType.className, parameters = {
        @Parameter(name = GenericEnumUserType.parameterEnumClass, value = StatusAvaliacao.className),
        @Parameter(name = GenericEnumUserType.parameterIdentifierMethod, value = "toChar"),
        @Parameter(name = GenericEnumUserType.parameterValueOfMethod, value = "fromChar")})
    private StatusAvaliacao status;
    //
    @Column(nullable=false)
    @Temporal(value = TemporalType.DATE)
    private Date dataAvaliacao;
    //
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
    @JoinColumn(name = "id_usuario", nullable = false)
    })
    private Avaliador avaliador;
    
    //
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_trabalho", nullable = false)
    private Trabalho trabalho;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({@JoinColumn(name = "id_revisao", nullable = false)})
    private Revisao revisao;

    public Revisao getRevisao() {
		return revisao;
	}

	public void setRevisao(Revisao revisao) {
		this.revisao = revisao;
	}

	public void setId(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setStatus(StatusAvaliacao status) {
        this.status = status;
    }

    public StatusAvaliacao getStatus() {
        return status;
    }



    public static Avaliacao gerar(AvaliacaoTO to){
        Avaliacao avaliacao = new Avaliacao();
        avaliacao.setId(to.getId());
        avaliacao.setStatus(to.getStatus());
        avaliacao.setTrabalho(null);
        avaliacao.setAvaliador(null);
        return avaliacao;

    }

    /**
     * @return the avaliador
     */
    public Avaliador getAvaliador() {
        return avaliador;
    }

    /**
     * @param avaliador the avaliador to set
     */
    public void setAvaliador(Avaliador avaliador) {
        this.avaliador = avaliador;
    }

    /**
     * @return the trabalho
     */
    public Trabalho getTrabalho() {
        return trabalho;
    }

    /**
     * @param trabalho the trabalho to set
     */
    public void setTrabalho(Trabalho trabalho) {
        this.trabalho = trabalho;
    }


    public AvaliacaoTO getTo(){
        AvaliacaoTO to = new AvaliacaoTO();
        to.setStatus(status);
        to.setDataAvaliacao(dataAvaliacao);
        to.setAvaliador(new AvaliadorTO());
        to.getAvaliador().setPessoa(this.getAvaliador().getPessoa().getTo());
        to.getAvaliador().setUsername(this.getAvaliador().getUsername());
        to.getAvaliador().setEmail(this.getAvaliador().getEmail());
        to.getAvaliador().setId(this.getAvaliador().getId());
        
        return to;
    }

    /**
     * @return the dataAvaliacao
     */
    public Date getDataAvaliacao() {
        return dataAvaliacao;
    }

    /**
     * @param dataAvaliacao the dataAvaliacao to set
     */
    public void setDataAvaliacao(Date dataAvaliacao) {
        this.dataAvaliacao = dataAvaliacao;
    }

}
